﻿using System;
using System.Text;
using System.Windows.Forms;
using System.Net;
using Custom;
using System.Xml;
using System.Collections.Generic;
using System.Drawing;

namespace BizkaiMove
{
    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
        }

        private void menuItem2_Click(object sender, EventArgs e)
        {
            switch (tabControl1.SelectedIndex)
            {
                case 0:
                    CargarIncidencias();
                    break;
                case 1:
                    CargarAccesos();
                    break;
                case 2:
                    CargarTiempos();
                    break;
                case 3:
                    CargarCamaras();
                    break;
                default:
                    break;
            }
        }

        private void CargarCamaras()
        {
            string urlCamaras = "http://www.bizkaimove.com/servlet/Flash?solicitud=4";
            helper.FormDisable(this, "Buscando camaras...");
            string xmlCamaras;
            try
            {
                xmlCamaras = helper.getWebRequestResult(urlCamaras);
            }
            catch
            {
                MessageBox.Show("No ha sido posible descargar la lista de camaras.", "Error");
                return;
            }
            finally
            {
                helper.FormEnable(this);
            }

            XmlDocument doc = helper.XmlGetDocumentFromSource(xmlCamaras);
            helper.FormDisable(this, "Cargando camaras...");
            try
            {
                ListViewItem nuevoItem = null;
                lstCamaras.BeginUpdate();
                lstCamaras.Items.Clear();
                foreach (XmlNode camara in doc.SelectNodes("//camara"))
                {
                    nuevoItem = new ListViewItem();
                    nuevoItem.SubItems.Add(camara.Attributes["referencia"].Value.Trim());
                    nuevoItem.SubItems.Add(camara.Attributes["derecha"].Value.Trim());
                    nuevoItem.SubItems.Add(camara.Attributes["izquierda"].Value.Trim());
                    nuevoItem.Tag = string.Format("http://www.bizkaimove.com/camaras/cam{0}.jpg", camara.Attributes["id"].Value);
                    nuevoItem.ImageIndex = 2;

                    lstCamaras.Items.Add(nuevoItem);
                }
                helper.ColumnsAutoSize(lstCamaras.Columns);
            }
            catch
            {
                MessageBox.Show("Error cargando las camaras. Formato de datos inesperado.", "Error");
                return;
            }
            finally
            {
                lstCamaras.EndUpdate();
                helper.FormEnable(this);
            }
        }

        private void CargarTiempos()
        {
            string urlTiempos = "http://www.bizkaimove.com/servlet/Flash?solicitud=3";
            helper.FormDisable(this, "Buscando tiempos de trayecto...");
            string xmlTiempos;
            try
            {
                xmlTiempos = helper.getWebRequestResult(urlTiempos);
            }
            catch
            {
                MessageBox.Show("No ha sido posible descargar los tiempos de trayecto.", "Error");
                return;
            }
            finally
            {
                helper.FormEnable(this);
            }

            XmlDocument doc = helper.XmlGetDocumentFromSource(xmlTiempos);
            helper.FormDisable(this, "Cargando tiempos...");
            try
            {
                treeTiempos.BeginUpdate();
                treeTiempos.Nodes[0].Nodes.Clear();
                TreeNode nuevoDesde = null, nuevoHasta = null;
                foreach (XmlNode panel in doc.SelectNodes("//panel"))
                {
                    nuevoDesde = new TreeNode();
                    nuevoDesde.Text = panel.SelectSingleNode("alias").InnerText.Trim();
                    treeTiempos.Nodes[0].Nodes.Add(nuevoDesde);

                    string hasta = panel.SelectSingleNode("texto").InnerText.Trim();
                    string[] partes = hasta.Split('\n');
                    string[] tmp;
                    foreach (string parte in partes)
                    {
                        if (parte.Trim().ToUpper() == "MIN")
                        {
                            continue;
                        }
                        tmp = parte.Split(' ');
                        nuevoHasta = new TreeNode();
                        nuevoHasta.Text = string.Format(" {0} minutos hasta {1}", tmp[tmp.GetUpperBound(0)].Trim(), parte.Replace(tmp[tmp.GetUpperBound(0)].Trim(),"").Replace("MIN","").Trim());

                        nuevoDesde.Nodes.Add(nuevoHasta);
                    }
                }
                treeTiempos.ExpandAll();
            }
            catch
            {
                MessageBox.Show("Error cargando las incidencias. Formato de datos inesperado.", "Error");
                return;
            }
            finally
            {
                treeTiempos.EndUpdate();
                helper.FormEnable(this);
            }
        }

        private void CargarIncidencias()
        {
            string urlIncidencias = string.Format("http://www.bizkaimove.com/servlet/Flash?solicitud=2&fechora={0}", DateTime.Now.ToString("yyMMddHHmm"));
            helper.FormDisable(this, "Buscando incidencias...");
            string xmlIncidencias;
            try
            {
                xmlIncidencias = helper.getWebRequestResult(urlIncidencias);
            }
            catch
            {
                MessageBox.Show("No ha sido posible descargar la lista de incidencias.","Error");
                return;
            }
            finally
            {
                helper.FormEnable(this);
            }

            XmlDocument doc = helper.XmlGetDocumentFromSource(xmlIncidencias);
            helper.FormDisable(this, "Cargando Incidencias...");
            try
            {
                ListViewItem nuevoItem = null;
                lstIncidencias.BeginUpdate();
                lstIncidencias.Items.Clear();
                foreach (XmlNode incidencia in doc.SelectNodes("//incidencia"))
                {
                    nuevoItem = new ListViewItem();
                    nuevoItem.ImageIndex = (incidencia.Attributes["tipo"].Value.Trim().ToUpper() == "OBRA" ? 0 : 1);
                    nuevoItem.SubItems.Add(incidencia.Attributes["tipo"].Value.Trim());
                    nuevoItem.SubItems.Add(incidencia.Attributes["referencia"].Value.Trim());
                    nuevoItem.SubItems.Add(incidencia.Attributes["sentido"].Value.Trim());

                    lstIncidencias.Items.Add(nuevoItem);
                }
                helper.ColumnsAutoSize(lstIncidencias.Columns);
            }
            catch
            {
                MessageBox.Show("Error cargando las incidencias. Formato de datos inesperado.", "Error");
                return;
            }
            finally
            {
                lstIncidencias.EndUpdate();
                helper.FormEnable(this);
            }
        }

        private void CargarAccesos()
        {
            string urlAccesos = "http://www.bizkaimove.com/castellano/tablaAccesos.jsp?id=12282143712200";
            helper.FormDisable(this, "Buscando accesos a Bilbao...");
            string htmlAccesos;
            try
            {
                htmlAccesos = helper.getWebRequestResult(urlAccesos);
            }
            catch
            {
                MessageBox.Show("No ha sido posible descargar el estado de los accesos.", "Error");
                return;
            }
            finally
            {
                helper.FormEnable(this);
            }

            helper.FormDisable(this, "Cargando accesos...");
            try
            {
                Dictionary<string,int> imageDic = new Dictionary<string,int>();
                ImageList imageList = new ImageList();               
                ListViewItem nuevoItem = null;
                lstAccesos.BeginUpdate();
                lstAccesos.Items.Clear();

                int startPoint = 0, endPoint = 0, lastImageIndex = -1;
                string imagePath = "", accessName = "";

                lstAccesos.SmallImageList = imageList;

                startPoint = htmlAccesos.IndexOf("class=\"txt_listado\" width=\"77%\">");

                while (startPoint > -1)
                {
                    nuevoItem = new ListViewItem();
                    endPoint = htmlAccesos.IndexOf("</td>", startPoint);
                    accessName = htmlAccesos.Substring(startPoint + 32, endPoint - startPoint - 32);
                    startPoint = htmlAccesos.IndexOf("src=\"", endPoint);
                    endPoint = htmlAccesos.IndexOf("\"></div", startPoint);
                    imagePath = "http://212.142.133.20/" + htmlAccesos.Substring(startPoint+7, endPoint - startPoint -7);

                    if (!imageDic.ContainsKey(imagePath))
                    {
                        lastImageIndex++;
                        imageDic.Add(imagePath, lastImageIndex);
                        imageList.Images.Add(helper.getWebRequestImage(imagePath));
                    }

                    nuevoItem.ImageIndex = imageDic[imagePath];
                    nuevoItem.SubItems.Add(accessName);
                    lstAccesos.Items.Add(nuevoItem);

                    htmlAccesos = htmlAccesos.Substring(endPoint);

                    startPoint = htmlAccesos.IndexOf("class=\"txt_listado\" width=\"77%\">");
                }

                helper.ColumnsAutoSize(lstAccesos.Columns);
            }
            catch
            {
                MessageBox.Show("Error cargando las incidencias. Formato de datos inesperado.", "Error");
                return;
            }
            finally
            {
                lstAccesos.EndUpdate();
                helper.FormEnable(this);
            }
        }

        private void menuItem3_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void lstCamaras_ItemActivate(object sender, EventArgs e)
        {
            ListViewItem camara = lstCamaras.FocusedItem;
            frmCamara vistaCamara = new frmCamara();
            vistaCamara.ShowDetail(camara.Tag.ToString(), camara.SubItems[1].Text, camara.SubItems[2].Text, camara.SubItems[3].Text);
        }
    }
}